{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线性回归\n",
    "这里我们会介绍一个简单的线性回归模型。这个模型形式如下：\n",
    "$$ y = Ax + b$$\n",
    "其中$x \\in R^n, A \\in R^{m \\times n}, b \\in R^m, y \\in R^m$\n",
    "\n",
    "我们假设输入x和输出y之间是线性的关系，根据训练数据集合X和Y来学习出最优的参数A和b。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 准备数据\n",
    "这里我们使用生成的数据，为了简单，我们这里假设x和y都是一维的实数。生成数据的方式是用”真实“（我们期望模型学习的）的数据加上随机的高斯噪声。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline  \n",
    "x_vals = np.linspace(0, 10, 100)\n",
    "realA = 2.5\n",
    "realb = -5\n",
    "y_reals = realA * x_vals + realb\n",
    "y_vals = y_reals + np.random.normal(0, 1, 100)\n",
    "\n",
    "\n",
    "# Plot the results\n",
    "plt.plot(x_vals, y_vals, 'o', label='Data')\n",
    "plt.plot(x_vals, y_reals, 'r-', label='Best fit line', linewidth=3)\n",
    "plt.legend(loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. SGD训练\n",
    "$$\\hat{y_i}=Ax_i+b $$\n",
    "$$L(\\hat{y_i}, y_i)=\\frac{1}{2}\\sum_i{(\\hat{y_i}-y_i)}^2 $$\n",
    "$$\\frac{dL}{dA}=\\sum_i (\\hat{y_i}-y_i) x_i$$\n",
    "$$\\frac{dL}{db}=\\sum_i (\\hat{y_i}-y_i)$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "init A=-0.8910765590338519, b=0\n",
      "final A=2.4550713790649468, b=-4.509023674759437\n"
     ]
    }
   ],
   "source": [
    "A=np.random.normal(0,1)\n",
    "b=0\n",
    "print(\"init A={0}, b={1}\".format(A, b))\n",
    "\n",
    "epochs=1000\n",
    "losses = []\n",
    "batch_size=10\n",
    "learning_rate=0.001\n",
    "for i in range(epochs):\n",
    "    rand_index = np.random.choice(len(x_vals), size=batch_size)\n",
    "    rand_x = x_vals[rand_index]\n",
    "    rand_y = y_vals[rand_index]\n",
    "    #forward\n",
    "    pred_y=A*rand_x+b\n",
    "    loss=np.sum((pred_y - rand_y)*(pred_y - rand_y))/2\n",
    "    losses.append(loss)\n",
    "    dLdA=np.sum((pred_y - rand_y)*rand_x)\n",
    "    dLdb=np.sum(pred_y - rand_y)\n",
    "    A=A-learning_rate*dLdA\n",
    "    b=b-learning_rate*dLdb\n",
    "\n",
    "print(\"final A={0}, b={1}\".format(A, b))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 结果显示"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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08fnz5/vl1xyiefm5vqaNWu8e/fu+2zr1ltv9c6dO/utt97qp512WnFoDRkyxN3dn332WZ87d667u996660l1t29e3eJ9k+fPt3PPPNM79u3r7dt29aXLFlSYr377rvPP/roIx80aNA+IbJ06VI/77zzfMGCBe7uvnr1au/Xr5/fcccd/swzz5T4XVm5cuU+v5tZWVk+ceLE4vn333/fly1bVurv8euvv+7z5s1L+rv+6KOPFt9Xc3fPycnxNWvW+J49ezwWixWHfPw2L7zwQl+7dq27u+fl5fmUKVPKDPCqNmfOHP/iiy9KlO3Zs8dHjBhR3KZEmzdv3uc8vPvuu2WGcywW808++WS/uOc3d+5c37t3b9I6GzduLPV3JV21LjiA/sAKIBu4O1ndqgiO0txzzz0O0TDS2rVrffr06WXWXbhwodetW9efeOIJf/311x3wESNGuEcH44Bfd911JS5ORb788ktftGhRcd3TTjutRL3LLrusxMXl+uuvd8DbtWuX8RA5UKf4nk9Z02uvvVahbbdt29aHDh3qXbt23WfZsGHDUq4/ZswYnzBhgn/88cclyps0aeKTJk0qnp8wYYK/+OKLvnXrVp8wYYKvXbu2eNntt9/ujRs3dohC96mnnvKePXuW2F63bt185MiRJcp+85vfOOCrVq3yXbt2+e23315i+VNPPVVi/qKLLioO+UcffdSnTJlS/Hu9c+dOv/vuu33z5s3+zDPP+FNPPeUnnHCCX3zxxT5ixAhfuXKljxo1yk855RS/8sorfcCAAT537lwfPny4FxYW+nvvvecNGjQo3lcsFvOxY8f6qlWr/MYbb3TAO3bs6BAF9+jRo33btm3Fbyy59tpr/YMPPvBp06YVjygMHDjQO3fu7Dk5OZ6VleUrVqzwW265xceNG1e8n1GjRvnOnTt9x44d/tBDD/natWs9Fov5Aw884MOHD/eFCxcWD8W++uqr/sc//tF/8pOfOODnn3++79mzxx955BFfvXp18c9i+fLl/t///d8ei8WKQ7qwsNBXrVrlmzdv9ssvv9zHjRvny5cvd4iuATt37nR393Xr1vlrr73mS5Ys8f79+/u6deuK21rUjoqiNgUHUBdYCXQDGgCfAceXVb+6gmPbtm1+zz33+O7duyu1nUmTJvmQIUM8Pz/fv/76awe8Xr16pdbNycnxvLy84nd5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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# Plot the result\n",
    "y_pred=A*x_vals+b\n",
    "plt.plot(x_vals, y_vals, 'o', label='Data Points')\n",
    "plt.plot(x_vals, y_reals, 'r-', label='Best fit line', linewidth=3)\n",
    "plt.plot(x_vals, y_pred, 'b-', label='learning line', linewidth=3)\n",
    "\n",
    "plt.legend(loc='upper left')\n",
    "plt.title('Linear Regression')\n",
    "plt.show()\n",
    "\n",
    "# Plot loss over time\n",
    "plt.plot(losses, 'k-')\n",
    "plt.title('L2 Loss per Generation')\n",
    "plt.xlabel('Generation')\n",
    "plt.ylabel('L2 Loss')\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py3.6-env",
   "language": "python",
   "name": "py3.6-env"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
